package com.leyou.upload.service.impl;

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.domain.ThumbImageConfig;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.leyou.upload.service.UploadService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * 图片上传的业务逻辑
 * @version 1.0.0
 * @Author yong.Mr
 * @data 2019-8-9
 */
@Service
public class UploadServiceImpl implements UploadService {

    /**
     * 图片的各种后缀类型
     */
    private static final List<String> CONTEN_TYPES = Arrays.asList("image/jpeg",
            "image/gif","image/png");
    /**
     * 生成一个日志对象
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(UploadServiceImpl.class);

    /**
     * 注入FastDFS的客户端
     */
    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    /**
     * 注入生成缩约图的客户端
     */
    @Autowired
    private ThumbImageConfig thumbImageConfig;
    /**
     * 上传图片到服务器
     * @param file 待上传的文件
     * @return String
     */
    @Override
    public String upload(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        // 校验文件类型
        // 获取文件类型----->:image/jpeg
        String contentType = file.getContentType();
        if(!CONTEN_TYPES.contains(contentType)){
            // 文件类型不符合, 将信息输出到Logger日志中去, 并返回null
            LOGGER.info("文件类型不合法：{}",originalFilename);
            return null;
        }

        try {
            // 校验文件内容
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            if(bufferedImage == null){
                LOGGER.info("文件内容不合法:{}",originalFilename);
                return null;
            }
            // 保存到图片服务器(一般用Linux系统, 两种方式:1,vsftpd 2,FastDFS分布式文件存储系统*推荐使用)
            //file.transferTo(new File(""));
            String ex = StringUtils.substringAfterLast(originalFilename, ".");
            StorePath storePath = this.fastFileStorageClient.uploadImageAndCrtThumbImage(file.getInputStream(),
                    file.getSize(),ex,null);
            // 带分组的路径
            String fullPath = storePath.getFullPath();
            // 获得分组
            // storePath.getGroup();

            // 获取缩略图路径URL,必须用带分组的路径生成缩约图
            String thumbImagePath = thumbImageConfig.getThumbImagePath(fullPath);
            // 在浏览器中一定需要加上分组才能访问到图片
            System.out.println("带分组的全路径为----->:" + fullPath + " ###  缩略图路径URL:" + thumbImagePath);

            // 必须返回带分组的路径url地址----->:group1/M00/00/00/wKitA14nnJaAPgiOAAC6lEdIspU961.png
            return ("http://129.204.87.172/" + fullPath.toString());
        } catch (IOException e) {
            LOGGER.info("服务器内部异常:{}", originalFilename);
            e.printStackTrace();
        }

        return null;
    }
}
